package com.srx.elasticsearch.listener;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import com.srx.openfeign.dto.MySQLDeleteEsByRabbitMQ;
import com.srx.openfeign.dto.MySQLInsertEsByRabbitMQ;
import com.srx.openfeign.dto.MySQLUpdateEsByRabbitMQ;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 监听器类，用于处理 RabbitMQ 队列中的消息，并对 Elasticsearch 进行操作。
 * @author srx
 */
@Component
public class Listener
{


    private final ElasticsearchClient client;

	@Autowired
	public Listener(ElasticsearchClient client)
	{
		this.client = client;
	}



    /**
     * 监听 RabbitMQ 队列 "insert"，用于向 Elasticsearch 插入文档。
     * 使用 ServiceToRabbitMQ 对象中的索引名、ID 和数据进行插入操作。
     *
     * @param insertMessage 包含要插入的数据、索引名和 ID 的对象
     * @throws IOException 如果与 Elasticsearch 的通信发生 I/O 异常
     */
    @RabbitListener(queues = "insert")
    public void insert(MySQLInsertEsByRabbitMQ insertMessage) throws IOException
    {
        client.create(e -> e
                .index(insertMessage.getIndexName())
                .id(String.valueOf(insertMessage.getId()))
                .document(insertMessage.getData()));
    }


    /**
     * 监听 RabbitMQ 队列 "update"，用于更新 Elasticsearch 中的文档。
     * 使用 ServiceToRabbitMQ 对象中的索引名、ID、更新内容及类类型执行更新操作。
     *
     * @param updateMessage 包含要更新的数据、索引名、ID 和类类型的对象
     * @throws IOException 如果与 Elasticsearch 的通信发生 I/O 异常
     */
    @RabbitListener(queues = "update")
    public void update(MySQLUpdateEsByRabbitMQ updateMessage) throws IOException
    {
        client.update(e -> e
                        .index(updateMessage.getIndexName())
                        .id(String.valueOf(updateMessage.getId()))
                        .doc(updateMessage.getData())
                   , updateMessage.getClassName());
    }


    /**
     * 监听 RabbitMQ 队列 "delete"，用于删除 Elasticsearch 中的文档。
     * 使用 MySQLDeleteEsByRabbitMQ 对象中的索引名和 ID 列表进行删除操作。
     *
     * @param deleteMessage 封装了索引名和 ID 列表的对象
     * @throws IOException 如果与 Elasticsearch 的通信发生 I/O 错误
     */
    @RabbitListener(queues = "delete")
    public void delete(MySQLDeleteEsByRabbitMQ deleteMessage) throws IOException
    {
        for (Object id : deleteMessage.getIdList())
        {
            client.delete(e -> e
                    .index(deleteMessage.getIndexName())
                    .id((String) id));
        }
    }

}
